package com.sky.service;

import com.github.pagehelper.Page;
import com.sky.dto.CreatingUserDTO;
import com.sky.dto.EmailCreatingUserDTO;
import com.sky.dto.LoginDTO;
import com.sky.dto.ChangePasswordDTO;
import com.sky.entity.Users;
import com.sky.vo.UserVO;
import com.sky.vo.UserProfileVO;
import cn.mybatis.mp.core.mybatis.mapper.context.Pager;

public interface UserService {

    /**
     * 用户申请创建账号时邮箱验证
     *
     * @param creatingUserDTO 用户创建账号表单
     */
    void creatingUserEmail(CreatingUserDTO creatingUserDTO) throws Exception;

    /**
     * 创建用户
     *
     * @param emailCreatingUserDTO 用户创建后端加密信息
     */
    void creatingUser(EmailCreatingUserDTO emailCreatingUserDTO) throws Exception;

    /**
     * 用户登录
     *
     * @param loginDTO 登录表单
     * @return userToken
     */
    String userLogin(LoginDTO loginDTO);

    /**
     * 分页查询用户列表
     *
     * @param page     页码
     * @param pageSize 每页大小
     * @param keyword  搜索关键词（用户名/邮箱）
     * @return 用户分页数据(UserVO)
     */
    Pager<UserVO> getUserList(int page, int pageSize, String keyword);

    /**
     * 获取用户详情
     *
     * @param userId 用户ID
     * @return 用户详情
     */
    UserVO getUserDetails(Integer userId);

    /**
     * 重置用户密码
     *
     * @param userId 用户ID
     * @return 新密码
     */
    String resetUserPassword(Integer userId);

    /**
     * 删除用户
     *
     * @param userId 用户ID
     */
    void deleteUser(Integer userId);

    /**
     * 修改用户密码
     *
     * @param userId            用户ID
     * @param changePasswordDTO 包含旧密码和新密码的DTO
     */
    void changePassword(Integer userId, ChangePasswordDTO changePasswordDTO);

    /**
     * 检查用户名和邮箱是否匹配
     *
     * @param username 用户名
     * @param email    邮箱
     * @return 是否匹配
     */
    boolean checkUserEmailMatch(String username, String email);

    /**
     * 根据邮箱查询用户
     *
     * @param email 邮箱
     * @return 用户对象
     */
    Users getUserByEmail(String email);

    /**
     * 通过邮箱重置密码
     *
     * @param email       邮箱
     * @param newPassword 新密码
     */
    void resetPasswordByEmail(String email, String newPassword);

    /**
     * 获取用户分页列表
     *
     * @param page 页码
     * @param pageSize 每页大小
     * @param name 搜索关键词（用户名）
     * @return 用户分页数据(users)
     */
    Page<Users> getUsersPage(Integer page, Integer pageSize, String name);

    /**
     * 用户退出登录
     * 
     * @param token 用户token
     */
    void userLogout(String token);

    /**
     * 获取用户个人信息
     *
     * @param userId 用户ID
     * @return 用户个人信息
     */
    UserProfileVO getUserProfile(Integer userId);
}
